package com.limanyik.family.oss.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.limanyik.family.common.entity.server.oss.dto.DownloadTheFileDto;
import com.limanyik.family.common.entity.server.oss.dto.UploadFileDto;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

@Component
public class OssUploadingServiceConfiguration {

    @Resource(name = "ossAccessConfig")
    OssAccessConfig ossAccessConfig;

    /**
     * 上传文件
     */
    public void uploadFiles(UploadFileDto uploadFileDto, MultipartFile file) throws IOException {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ossAccessConfig.getENDPOINT(), ossAccessConfig.getACCESS_KEY_ID(), ossAccessConfig.getACCESS_KEY_SECRET());

        // 创建PutObjectRequest对象。
        // 依次填写Bucket名称（例如examplebucket）、Object完整路径（例如exampledir/exampleobject.txt）和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。

        PutObjectRequest putObjectRequest = new PutObjectRequest(uploadFileDto.getBucketName(), uploadFileDto.getUrl() + uploadFileDto.getKey(), file.getInputStream());

        // 如果需要上传时设置存储类型和访问权限，请参考以下示例代码。
        // ObjectMetadata metadata = new ObjectMetadata();
        // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        // metadata.setObjectAcl(CannedAccessControlList.Private);
        // putObjectRequest.setMetadata(metadata);

        // 上传文件。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 下载文件
     *
     * @param response
     * @param downloadTheFileDto
     */
    @SneakyThrows
    public void downloadTheFile(HttpServletResponse response, DownloadTheFileDto downloadTheFileDto) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ossAccessConfig.getENDPOINT(), ossAccessConfig.getACCESS_KEY_ID(), ossAccessConfig.getACCESS_KEY_SECRET());
        // 下载Object到本地文件，并保存到指定的本地路径中。如果指定的本地文件存在会覆盖，不存在则新建。
        // 如果未指定本地路径，则下载后的文件默认保存到示例程序所属项目对应本地路径中。
        ossClient.getObject(new GetObjectRequest(downloadTheFileDto.getBucketName(), downloadTheFileDto.getObjectName() + downloadTheFileDto.getFileName()), new File(ossAccessConfig.getLOCAL_FILE_DOWNLOAD_DEFAULT_URL() + "\\" + downloadTheFileDto.getFileName()));
        // 关闭OSSClient。
        ossClient.shutdown();
    }


}
